require 'apr.uri'
require 'moonunit'

test_uri = moonunit.TestCase:new()

function test_uri:test_parse()
    local parsed = apr.uri.parse('http://user:pass@www.example.com:80/path/part?q=val&q2=val2#mark')
    assert(parsed.scheme == 'http')
    assert(parsed.user == 'user')
    assert(parsed.password == 'pass')
    assert(parsed.host == 'www.example.com')
    assert(parsed.port == 80)
    assert(parsed.path == '/path/part')
    assert(parsed.query == 'q=val&q2=val2')
    assert(parsed.query_parsed.q == 'val')
    assert(parsed.query_parsed.q2 == 'val2')
    assert(parsed.fragment == 'mark')
end

function test_uri:test_parsenil()
    local parsed = apr.uri.parse('http://www.google.com')
    assert(parsed.user == nil)
end

function test_uri:test_parsequery()
    local parsed = apr.uri.parse_query('name1=val1&name2=val2')
    assert(parsed.name1 == 'val1')
    assert(parsed.name2 == 'val2')
end

function test_uri:test_parsequeryplus()
    local parsed = apr.uri.parse_query('name=val1+val2')
    assert(parsed.name == 'val1 val2')
end

function test_uri:test_parsequeryencode()
    local parsed = apr.uri.parse_query('name%2f=val%2E')
    assert(parsed['name/'] == 'val.')
end

function test_uri:test_fragment ()
    local parsed = apr.uri.parse('/path/#fragment')
    assert(parsed.path == '/path/')
    assert(parsed.fragment == 'fragment')
    assert(parsed.host == nil)
end

function test_uri:test_parsequery_nomutate()
    local qs = 'name=val1&name2=val2'
    apr.uri.parse_query(qs)
    assert(qs .. 'm' == 'name=val1&name2=val2m')
end
